package com.hsnn.medstgmini.base.std.controller;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.hsnn.medstgmini.Constants;
import com.hsnn.medstgmini.base.std.model.StdCompinfo;
import com.hsnn.medstgmini.base.std.model.StdCompprofile;
import com.hsnn.medstgmini.base.std.service.CompProfileManager;
import com.hsnn.medstgmini.base.std.service.StdCompprofileManager;
import com.hsnn.medstgmini.exception.MSException;
import com.hsnn.medstgmini.model.Img;
import com.hsnn.medstgmini.model.Status;
import com.hsnn.medstgmini.sys.model.SysUser;
import com.hsnn.medstgmini.util.ImgUtil;
import com.hsnn.medstgmini.util.Pagination;

/**
 * @category 企业端基础库资质管理
 * @author 蔡春龙
 * @date 2015年9月9日
 */
@Controller
@RequestMapping("/compProfile")
public class CompProfileController {

	private static final Logger log = Logger
			.getLogger(CompProfileController.class);

	@Autowired
	private CompProfileManager compProfileManager;

	@Autowired
	private StdCompprofileManager stdCompprofileManager;

	@Autowired
	private HttpServletRequest request;

	@Autowired
	private HttpSession session;

	/**
	 * @category 获取当前登陆人信息
	 * @author 言科
	 * @date 2015年7月22日 SysUser
	 */
	public SysUser getUser() {
		return (SysUser) session.getAttribute(Constants.USERINFO);
	}

	/**
	 * @category 企业端->基础库->企业资质库
	 * @author 韩守松
	 * @date 2015年8月24日
	 * @param @param compId
	 * @param @return
	 */
	@RequestMapping("/toCompProfileList")
	public String toCompProfileList(Model model) {
		List<Map<String, String>> typeList = compProfileManager
				.getCompProfileTypeList();
		model.addAttribute("typeList", typeList);
		return "/base/std/sc/profile/compProfileList";
	}

	/**
	 * @category 企业端->基础库->企业资质库
	 * @date 2015年9月9日
	 * @param page
	 * @param compprofile
	 * @return
	 */
	@RequestMapping("/getCompProfileList")
	@ResponseBody
	public Pagination getCompProfileList(StdCompprofile compProfile) {
		Pagination page = new Pagination(request);
		try {
			StdCompinfo compInfo = getUser().getInfo();
			if (compInfo != null) {
				compProfile.setCompId(compInfo.getCompId());
			}
			compProfileManager.getSelfCompProfileList(page, compProfile);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 企业端->基础库->企业资质库->提交企业资质
	 * @date 2015年9月9日
	 * @param compProfile
	 * @return
	 */
	@RequestMapping("/submitCompProfile")
	@ResponseBody
	public Pagination submitCompProfile(StdCompprofile compProfile) {
		Pagination page = new Pagination(request);
		String array = request.getParameter("array");
		try {
			if (StringUtils.isNotBlank(array)) {
				Gson gson = new Gson();
				Type type = new TypeToken<List<StdCompprofile>>() {
				}.getType();
				List<StdCompprofile> list = gson.fromJson(array, type);
				if (list != null && list.size()>0) {
					for(StdCompprofile form:list){
						form.setCompId(((StdCompinfo)getUser().getInfo()).getCompId());
						form.setUpdUser(getUser().getId());
						compProfileManager.submitCompProfile(form);
						page.setSuccess(true);
					}
				}else{
					page.setSuccess(false);
					return page;
				}
			} else{
				page.setSuccess(false);
				return page;
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 中心->基础库->企业资质库->资质查看(企业列表)
	 * @date 2015年9月9日
	 * @return
	 */
	@RequestMapping("/toCompinfoViewList")
	public String toCompinfoViewList() {
		return "/base/std/zx/profile/compinfoViewList";
	}

	/**
	 * @category 中心->基础库->企业资质库->资质查看->资质管理(资质列表)
	 * @date 2015年9月9日
	 * @return
	 */
	@RequestMapping("/toCompProfileViewList")
	public String toCompProfileViewList(Model model, String compId) {
		List<Map<String, String>> typeList = compProfileManager
				.getCompProfileTypeList();
		model.addAttribute("typeList", typeList);
		model.addAttribute("compId", compId);
		return "/base/std/zx/profile/compProfileViewList";
	}

	/**
	 * @category 中心->基础库->企业资质库->资质查看->资质管理(资质列表)
	 * @date 2015年9月9日
	 * @param page
	 * @param compprofile
	 * @return
	 */
	@RequestMapping("/getCompProfileViewList")
	@ResponseBody
	public Pagination getCompProfileViewList(StdCompprofile compProfile) {
		Pagination page = new Pagination(request);
		try {
			compProfileManager.getSelfCompProfileList(page, compProfile);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 中心->基础库->企业资质库->资质审核(企业列表)
	 * @date 2015年9月9日
	 * @return
	 */
	@RequestMapping("/toSomeCompinfoViewList")
	public String toSomeCompinfoViewList() {
		return "/base/std/zx/profile/someCompinfoViewList";
	}

	/**
	 * @category 中心->基础库->企业资质库->资质审核(有资质待审核的企业列表)
	 * @date 2015年9月9日
	 * @param page
	 * @param compProfile
	 * @return
	 */
	@RequestMapping("/getSomeCompinfoViewList")
	@ResponseBody
	public Pagination getSomeCompinfoViewList(StdCompinfo compinfo) {
		Pagination page = new Pagination(request);
		try {
			page.setForm(compinfo);
			compProfileManager.getSomeCompinfoViewList(page);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 中心->基础库->企业资质库->资质审核->资质列表
	 * @date 2015年9月9日
	 * @return
	 */
	@RequestMapping("/toCompProfileAuditList")
	public String toCompProfileAuditList(Model model, String compId) {
		model.addAttribute("compId", compId);
		return "/base/std/zx/profile/compProfileAuditList";
	}

	/**
	 * @category 中心->基础库->企业资质库->资质审核->资质列表
	 * @date 2015年9月9日
	 * @param page
	 * @param compprofile
	 * @return
	 */
	@RequestMapping("/getCompProfileAuditList")
	@ResponseBody
	public Pagination getCompProfileAuditList(StdCompprofile compProfile) {
		Pagination page = new Pagination(request);
		try {
			compProfile.setAuditStatus(0);
			compProfileManager.getSelfCompProfileList(page, compProfile);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 中心->基础库->企业资质库->资质审核->资质列表->审核通过
	 * @date 2015年9月9日
	 * @param page
	 * @param compProfile
	 * @return
	 */
	@RequestMapping("/approve")
	@ResponseBody
	public Pagination approve(StdCompprofile compProfile) {
		Pagination page = new Pagination(request);
		try {
			compProfile.setStatus(Status.enabled.getKey());
			compProfile.setAuditStatus(1);
			compProfileManager.auditCompProfile(compProfile, getUser());
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 中心->基础库->企业资质库->资质审核->资质列表->审核不通过
	 * @date 2015年9月9日
	 * @param page
	 * @param compProfile
	 * @return
	 */
	@RequestMapping("/unapprove")
	@ResponseBody
	public Pagination unapprove(StdCompprofile compProfile) {
		Pagination page = new Pagination(request);
		try {
			compProfile.setStatus(Status.invalid.getKey());
			compProfile.setAuditStatus(2);
			compProfileManager.auditCompProfile(compProfile, getUser());
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 中心->基础库->企业资质库->资质查看->资质管理->保存企业资质
	 * @author 韩守松
	 * @date 2015年8月24日
	 * @param @return
	 */
	//@RequestMapping("/zxSaveCompProfile")
	@RequestMapping(value={"/add","/edit"})
	@ResponseBody
	public Pagination zxSaveCompProfile(StdCompprofile compProfile,
			MultipartFile profile) {
		Pagination page = new Pagination(request);
		try {
			SysUser user = (SysUser) request.getSession().getAttribute(
					Constants.USERINFO);
			compProfile.setUpdUser(user.getId());
			compProfile.setUpdDatetime(new Date());
			if (StringUtils.isBlank(compProfile.getCompprofileId())) {// 企业资质新增
				if (profile == null || profile.isEmpty()) {
					page.setSuccess(false);
					page.setMsg("请上传企业资质证书！");
					return page;
				}
				Img img = ImgUtil.uploadProfile(profile);
				compProfile.setProfilePicAddr(img.getPath());
				compProfile.setProfilePicShortcutAddr(img.getPath());
				compProfile.setProfileCode("ZZ" + new Date().getTime());
				compProfile.setStatus(Status.invalid.getKey());
				compProfile.setAuditStatus(0);
				// 企业资质新增
				stdCompprofileManager.save(page, compProfile);
				page.setSuccess(true);
			} else {// 企业资质修改
				StdCompprofile oldProfile = stdCompprofileManager
						.getStdCompprofileById(compProfile.getCompprofileId());
				if (profile == null || profile.isEmpty()) {
					compProfile.setProfilePicAddr(oldProfile
							.getProfilePicAddr());
					compProfile.setProfilePicShortcutAddr(oldProfile
							.getProfilePicShortcutAddr());
				} else {
					Img img = ImgUtil.uploadProfile(profile);
					compProfile.setProfilePicAddr(img.getPath());
					compProfile.setProfilePicShortcutAddr(img.getPath());
				}
				compProfile.setStatus(oldProfile.getStatus());
				compProfile.setProfileCode(oldProfile.getProfileCode());
				compProfile.setAuditStatus(oldProfile.getAuditStatus());
				compProfile.setAuditDatetime(oldProfile.getAuditDatetime());
				compProfile.setAuditRemark(oldProfile.getAuditRemark());
				compProfile.setAuditUser(oldProfile.getAuditUser());
				stdCompprofileManager.edit(page, compProfile);
				page.setSuccess(true);
			}
		} catch (MSException e) {
			log.error("",e);
			page.setSuccess(false);
			page.setMsg(e.getMsg());
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 中心->基础库->企业资质库->资质查看->资质管理->启用
	 * @date 2015年9月9日
	 * @param page
	 * @param compProfile
	 * @return
	 */
	@RequestMapping("/enabled")
	@ResponseBody
	public Pagination enabled(StdCompprofile compProfile) {
		Pagination page = new Pagination(request);
		try {
			compProfile.setStatus(Status.enabled.getKey());
			compProfileManager.changeCompProfileStatus(compProfile, getUser());
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 中心->基础库->企业资质库->资质查看->资质管理->停用
	 * @date 2015年9月9日
	 * @param page
	 * @param compProfile
	 * @return
	 */
	@RequestMapping("/disabled")
	@ResponseBody
	public Pagination disabled(StdCompprofile compProfile) {
		Pagination page = new Pagination(request);
		try {
			compProfile.setStatus(Status.invalid.getKey());
			compProfileManager.changeCompProfileStatus(compProfile, getUser());
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	@RequestMapping("/toCompProfileLogList")
	public String toCompProfileLogList(String compprofileId) throws UnsupportedEncodingException {
		request.setAttribute("compprofileId", compprofileId);
		request.setAttribute("profileCode", request.getParameter("profileCode"));
		String profileName = new String (request.getParameter("profileName").getBytes("ISO8859-1"),"utf-8");
		request.setAttribute("profileName", profileName);
		return "/base/std/zx/profile/compProfileLogList";
	}

	
	/**
	 * @category 日志详情
	 * @param model
	 * @param logId
	 * @return
	 */
	@RequestMapping("/toCompProfileLogDetail")
	public String toStdProdDrugInfoLogDetail(Model model, String logId) {
		printParams();
		List<Map<String, Object>> list = compProfileManager.getCompProfileLogDetail(logId);
		// --------begin
		List<Map<String,Object>> dataList = new ArrayList<Map<String,Object>>();
		List<Map<String,Object>> mapList = new ArrayList<Map<String,Object>>();
		String[] cColunm = {"资质编码","资质名称","资质类型","有效期开始日期","有效期截止日期","状态","备注"};
		String[] eColunm = {"profileCode","profileName","firstLevelIndiName","profileStarttime","profileEndtime","status","remark"};
		for(int i = 0;i<cColunm.length;i++){
			Map<String,Object> map =  new HashMap<String,Object>();
			map.put("colunm", cColunm[i]);//字段名
			map.put("after", !"status".equals(eColunm[i])?list.get(0).get(eColunm[i]):Status.getName(Integer.parseInt(list.get(0).get(eColunm[i]).toString())));//修改后数据
			map.put("before", list.size()==1?null:!"status".equals(eColunm[i])?list.get(1).get(eColunm[i]):Status.getName(Integer.parseInt(list.get(1).get(eColunm[i]).toString())));//修改前数据
			if(list.size()==1){
				map.put("red", "1");//是否变红加粗 1是 0 否
			}else{
				//判断修改后与修改前数据是否相等
				if(list.get(0).get(eColunm[i])!=null&&list.get(1).get(eColunm[i])!=null&&!list.get(0).get(eColunm[i]).toString().equals(list.get(1).get(eColunm[i]).toString())){
					map.put("red", "1");
				}else{
					map.put("red", "0");
				}
			}
			mapList.add(map);
		}
		for(int i = 0;i<mapList.size();i++){//把要变红的放在list前面
			if("1".equals(mapList.get(i).get("red"))){
				dataList.add(mapList.get(i));
			}
		}
		for(int i = 0;i<mapList.size();i++){
			if("0".equals(mapList.get(i).get("red"))){
				dataList.add(mapList.get(i));
			}
		}
		request.setAttribute("dataList", dataList);
		// --------end
		request.setAttribute("list", list);

		return "/base/std/zx/profile/compProfileLogDetail";
	}
	/**
	 * 
	 *@category 获取参数打印
	 *@author wangbing
	 *@date 2015年6月9日
	 *Pagination
	 */
	@SuppressWarnings("rawtypes")
	public void printParams(){
		Enumeration paramNames = request.getParameterNames();
		try {
			while (paramNames.hasMoreElements()) {
				String paramName = (String) paramNames.nextElement();
				String paramValue = request.getParameter(paramName);
				log.info(paramName+":"+paramValue);
			}
		} catch (Exception e) {
			log.error("",e);
		}
	}
}
